package com.jishuo.pzk.dao;

import com.jishuo.pzk.bean.base.*;
import com.jishuo.pzk.bean.dto.SelectReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 基础数据
 */
@Mapper
public interface VoucherMapper {
    /**
     * 获取序列下一个ID
     * @param seqName 序列名称
     * @return 返回序列的下一个ID
     */
    long getSeqNextID(String seqName);

    /**
     * 列出所有凭证类型
     * @return 返回凭证类型列表
     */
    List<VoucherTypeVO> listVoucherType();

    /**
     * 获取凭证模板页面信息
     * @param vocode 凭证代码
     * @param page 页码
     * @return 返回凭证模板页面信息
     */
    VouTempPageVO getVouTempPage(@Param("vocode") String vocode, @Param("page") int page);

    /**
     * 获取指定页面ID的凭证字段
     * @param pageId 页面ID
     * @return 返回凭证字段列表
     */
    List<VouFieldVO> getVouField(String pageId);

    /**
     * 列出所有凭证模板页面
     * @return 返回凭证模板页面列表
     */
    List<VouTempPageVO> listVouPage();

    /**
     * 获取凭证印章信息
     * @param agencyId 机构ID
     * @return 返回凭证印章信息
     */
    VouSealVO getVouSeal(String agencyId);

    /**
     * 列出所有凭证和印章信息
     * @return 返回凭证和印章信息列表
     */
    List<VouandSealVO> listVouandSeal();

    /**
     * 获取凭证印章信息（另一种形式的返回）
     * @param agencyId 机构ID
     * @return 返回包含凭证印章信息的Map
     */
    Map<String, Object> getVouSeal1(String agencyId);

    /**
     * 根据条件查询凭证
     * @param vo 查询条件
     * @return 返回查询到的凭证信息
     */
    VoucherVO findVoucher(VoucherVO vo);

    /**
     * 插入凭证信息
     * @param vo 凭证信息
     * @return 返回插入操作的影响行数
     */
    int insertVoucher(@Param("vo") VoucherVO vo);

    /**
     * 更新凭证的启用状态
     * @param vo_sn 凭证序列号
     * @return 返回更新操作的影响行数
     */
    int updateIsenable(String vo_sn);

    /**
     * 删除凭证详情信息
     * @param vo_de_sn 凭证详情序列号
     * @return 返回删除操作的影响行数
     */
    int deleteVoucherDetail(String vo_de_sn);

    /**
     * 保存凭证详情信息
     * @param list 凭证详情列表
     * @return 返回保存操作的影响行数
     */
    int saveVoucherDetail(List<VoucherDetailVO> list);

    /**
     * 根据凭证详情序列号查询凭证详情信息
     * @param vo_de_sn 凭证详情序列号
     * @return 返回查询到的凭证详情列表
     */
    List<VoucherDetailVO> findVoucherDetailVO(String vo_de_sn);

    /**
     * 查询用于绘制的凭证列表
     * @return 返回可用于绘制的凭证列表
     */
    List<VoucherVO> listVoucherForDraw();

    /**
     * 根据参数查询凭证文件信息
     * @param billNum 账单号
     * @param sn 序列号
     * @param id 文件ID
     * @return 返回查询到的凭证文件列表
     */
    List<VoucherFileVO> findVoucherFile(@Param("billNum") String billNum, @Param("sn") String sn, @Param("id") String id);

    /**
     * 插入凭证文件信息
     * @param vo 凭证文件信息
     * @return 返回插入操作的影响行数
     */
    int insertVoucherFile(VoucherFileVO vo);

    /**
     * 更新凭证文件信息
     * @param vo 凭证文件信息
     * @return 返回更新操作的影响行数
     */
    int updateVoucherFile(VoucherFileVO vo);

    /**
     * 更新凭证的绘制状态
     * @param vo_sn 凭证序列号
     * @return 返回更新操作的影响行数
     */
    int updateVoucherDraw(String vo_sn);

    /**
     * 根据条件查询凭证
     * @param req 查询条件
     * @return 返回查询到的凭证列表
     */
    List<VoucherVO> selectVoucher(@Param("re") SelectReq req);

    /**
     * 列出所有凭证类型
     * @return 返回凭证类型列表
     */
    List<VoucherTypeVO> selectVoucherType();

    /**
     * 根据参数查询凭证信息
     * @param biliNum 比例号
     * @param type 类型
     * @return 返回查询到的凭证信息
     */
    VoucherVO findVoucherVO(@Param("biliNum") String biliNum, @Param("type") Integer type);

    /**
     * 更新凭证的启用状态（三种状态）
     * @param biliNum 比例号
     * @param type 类型
     * @param sn 序列号
     * @return 返回更新操作的影响行数
     */
    int updateVoucherIsEnableThree(@Param("biliNum") String biliNum, @Param("type") String type, @Param("sn") String sn);
}
